#!/bin/bash

# 多平台返利系统部署脚本
# 使用方法: ./scripts/deploy.sh [环境] [操作]
# 环境: dev/test/prod
# 操作: build/start/stop/restart/logs/status

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 项目配置
PROJECT_NAME="union-all-api"
PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
DOCKER_COMPOSE_FILE="docker-compose.yml"

# 默认参数
ENVIRONMENT=${1:-dev}
ACTION=${2:-start}

# 日志函数
log_info() {
    echo -e "${GREEN}[INFO]${NC} $1"
}

log_warn() {
    echo -e "${YELLOW}[WARN]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

log_debug() {
    echo -e "${BLUE}[DEBUG]${NC} $1"
}

# 检查依赖
check_dependencies() {
    log_info "检查系统依赖..."
    
    # 检查Docker
    if ! command -v docker &> /dev/null; then
        log_error "Docker 未安装，请先安装 Docker"
        exit 1
    fi
    
    # 检查Docker Compose
    if ! command -v docker-compose &> /dev/null; then
        log_error "Docker Compose 未安装，请先安装 Docker Compose"
        exit 1
    fi
    
    # 检查Maven（仅在构建时需要）
    if [[ "$ACTION" == "build" ]] && ! command -v mvn &> /dev/null; then
        log_error "Maven 未安装，请先安装 Maven"
        exit 1
    fi
    
    log_info "依赖检查完成"
}

# 检查环境文件
check_env_file() {
    if [[ ! -f "$PROJECT_DIR/.env" ]]; then
        log_warn ".env 文件不存在，正在从模板创建..."
        cp "$PROJECT_DIR/.env.example" "$PROJECT_DIR/.env"
        log_warn "请编辑 .env 文件并配置相应的参数"
        log_warn "配置完成后重新运行部署脚本"
        exit 1
    fi
}

# 安装SDK依赖
install_sdk() {
    log_info "安装第三方SDK依赖..."
    
    cd "$PROJECT_DIR"
    
    # 检查SDK文件是否存在
    SDK_DIR="union-web/src/main/resources/lib"
    if [[ ! -d "$SDK_DIR" ]]; then
        log_error "SDK目录不存在: $SDK_DIR"
        exit 1
    fi
    
    # 安装京东联盟SDK
    JD_SDK="$SDK_DIR/open-api-sdk-2.0-2024-09-27.jar"
    if [[ -f "$JD_SDK" ]]; then
        log_info "安装京东联盟SDK..."
        mvn install:install-file \
            -Dfile="$JD_SDK" \
            -DgroupId=open.api.sdk \
            -DartifactId=open-api-sdk \
            -Dversion=2.0 \
            -Dpackaging=jar
    else
        log_warn "京东联盟SDK文件不存在: $JD_SDK"
    fi
    
    # 安装淘宝联盟SDK
    TAOBAO_SDK="$SDK_DIR/taobao-sdk-NEW_JAVA.jar"
    if [[ -f "$TAOBAO_SDK" ]]; then
        log_info "安装淘宝联盟SDK..."
        mvn install:install-file \
            -Dfile="$TAOBAO_SDK" \
            -DgroupId=tao.bao.sdk \
            -DartifactId=taobao-sdk-java-auto \
            -Dversion=1.1 \
            -Dpackaging=jar
    else
        log_warn "淘宝联盟SDK文件不存在: $TAOBAO_SDK"
    fi
    
    # 安装拼多多SDK
    PDD_SDK="$SDK_DIR/pop-sdk-1.18.41-all.jar"
    if [[ -f "$PDD_SDK" ]]; then
        log_info "安装拼多多SDK..."
        mvn install:install-file \
            -Dfile="$PDD_SDK" \
            -DgroupId=pop.sdk \
            -DartifactId=pop-sdk \
            -Dversion=1.18.41 \
            -Dpackaging=jar
    else
        log_warn "拼多多SDK文件不存在: $PDD_SDK"
    fi
    
    log_info "SDK安装完成"
}

# 构建应用
build_app() {
    log_info "构建应用..."
    
    cd "$PROJECT_DIR"
    
    # 安装SDK依赖
    install_sdk
    
    # Maven构建
    log_info "执行Maven构建..."
    mvn clean package -DskipTests -q
    
    # 构建Docker镜像
    log_info "构建Docker镜像..."
    docker build -t "$PROJECT_NAME:latest" -f union-web/src/main/resources/docker/Dockerfile union-web/target/
    
    log_info "应用构建完成"
}

# 启动服务
start_services() {
    log_info "启动服务..."
    
    cd "$PROJECT_DIR"
    
    # 检查是否需要构建
    if ! docker images | grep -q "$PROJECT_NAME"; then
        log_info "镜像不存在，开始构建..."
        build_app
    fi
    
    # 启动服务
    docker-compose -f "$DOCKER_COMPOSE_FILE" up -d
    
    # 等待服务启动
    log_info "等待服务启动..."
    sleep 30
    
    # 检查服务状态
    check_services_health
    
    log_info "服务启动完成"
    log_info "访问地址:"
    log_info "  - 应用服务: http://localhost:48080"
    log_info "  - API文档: http://localhost:48080/doc.html"
    log_info "  - 数据库管理: http://localhost:8080 (需要启用tools profile)"
}

# 停止服务
stop_services() {
    log_info "停止服务..."
    
    cd "$PROJECT_DIR"
    docker-compose -f "$DOCKER_COMPOSE_FILE" down
    
    log_info "服务已停止"
}

# 重启服务
restart_services() {
    log_info "重启服务..."
    stop_services
    start_services
}

# 查看日志
show_logs() {
    cd "$PROJECT_DIR"
    
    if [[ -n "$3" ]]; then
        # 查看指定服务的日志
        docker-compose -f "$DOCKER_COMPOSE_FILE" logs -f "$3"
    else
        # 查看所有服务的日志
        docker-compose -f "$DOCKER_COMPOSE_FILE" logs -f
    fi
}

# 检查服务状态
check_status() {
    log_info "检查服务状态..."
    
    cd "$PROJECT_DIR"
    docker-compose -f "$DOCKER_COMPOSE_FILE" ps
}

# 检查服务健康状态
check_services_health() {
    log_info "检查服务健康状态..."
    
    # 检查MySQL
    if docker-compose -f "$DOCKER_COMPOSE_FILE" exec -T mysql mysqladmin ping -h localhost --silent; then
        log_info "MySQL: 健康"
    else
        log_error "MySQL: 不健康"
    fi
    
    # 检查Redis
    if docker-compose -f "$DOCKER_COMPOSE_FILE" exec -T redis redis-cli ping | grep -q PONG; then
        log_info "Redis: 健康"
    else
        log_error "Redis: 不健康"
    fi
    
    # 检查应用
    if curl -f http://localhost:48080/actuator/health &> /dev/null; then
        log_info "应用: 健康"
    else
        log_error "应用: 不健康"
    fi
}

# 清理资源
cleanup() {
    log_info "清理资源..."
    
    cd "$PROJECT_DIR"
    
    # 停止并删除容器
    docker-compose -f "$DOCKER_COMPOSE_FILE" down -v
    
    # 删除镜像
    if docker images | grep -q "$PROJECT_NAME"; then
        docker rmi "$PROJECT_NAME:latest"
    fi
    
    # 清理未使用的资源
    docker system prune -f
    
    log_info "资源清理完成"
}

# 显示帮助信息
show_help() {
    echo "多平台返利系统部署脚本"
    echo ""
    echo "使用方法:"
    echo "  $0 [环境] [操作] [服务名]"
    echo ""
    echo "环境:"
    echo "  dev     开发环境 (默认)"
    echo "  test    测试环境"
    echo "  prod    生产环境"
    echo ""
    echo "操作:"
    echo "  build     构建应用"
    echo "  start     启动服务 (默认)"
    echo "  stop      停止服务"
    echo "  restart   重启服务"
    echo "  logs      查看日志"
    echo "  status    查看状态"
    echo "  health    健康检查"
    echo "  cleanup   清理资源"
    echo "  help      显示帮助"
    echo ""
    echo "示例:"
    echo "  $0 dev build          # 构建开发环境"
    echo "  $0 prod start         # 启动生产环境"
    echo "  $0 test logs app      # 查看测试环境应用日志"
    echo "  $0 dev status         # 查看开发环境状态"
}

# 主函数
main() {
    log_info "开始执行部署脚本..."
    log_info "环境: $ENVIRONMENT"
    log_info "操作: $ACTION"
    
    # 切换到项目目录
    cd "$PROJECT_DIR"
    
    case "$ACTION" in
        "build")
            check_dependencies
            build_app
            ;;
        "start")
            check_dependencies
            check_env_file
            start_services
            ;;
        "stop")
            stop_services
            ;;
        "restart")
            check_dependencies
            check_env_file
            restart_services
            ;;
        "logs")
            show_logs "$@"
            ;;
        "status")
            check_status
            ;;
        "health")
            check_services_health
            ;;
        "cleanup")
            cleanup
            ;;
        "help")
            show_help
            ;;
        *)
            log_error "未知操作: $ACTION"
            show_help
            exit 1
            ;;
    esac
    
    log_info "脚本执行完成"
}

# 执行主函数
main "$@"
